package Oop05;

public class Test05 {
    public static void drawMap(Shape shape){//传过来的每一个类型都是 shape 的子类
        //通过 shape 来调用 draw 方法
        shape.draw();
    }
    public static void main(String[] args) {
        Dog dog = new Dog("张三", 18);
//        Animal animal1 = new Animal("aa" , 20);//如果一个类不能具体的表示某事物 , 那我们就称这个类为抽象类
        //如果一个类不能具体的表示某事物 , 那我们就称这个类为抽象类
        //抽象类一般使用 abstract 来修饰 ， 不能通过 new 关键字来实例化了
        //抽象类中 如果一个方法没有具体的实现 ， 那么就把这个方法修改为 abstract 修饰
        //如果一个类有抽象方法 ， 那么该类必须是抽象类 ， 相反 ， 如果一个类是抽象类 ， 那么可以没有抽象方法
        //如果一个类继承了这个抽象类 ， 那么比需要重写这个这个抽象类中的抽象方法
        //如果一个类集成了一个抽象类 ， 然后不想重写抽象类当中的方法 ， 只能把当前这个类也设置为抽象类 ，但是需要注意的是 ，这些抽象类最终都必须被重写 ， 只要有其他的普通类继承了这些类 都将被重写
//        抽象类不能是 private
//        抽象方法不能被 final 和 static 修饰 ，因为抽象方法要按被子类重写
//        抽象类必须被继承 ， 并且继承后子类要重写父类中的抽象方法 ， 否则子类也是抽象类 ， 也必须用 abstract 来修饰
        /*抽象类和普通类的区别：
        抽象类不能被实例化
        抽象类当中可以有由抽象方法

        * */
        System.out.println("__________");

        //使用和普通类没什么区别 ， 抽象类只是不能进行实例化
        drawMap(new Cycle());//new Cycle 这种形式叫匿名对象 ， 它只能使用一次
        drawMap(new Flower());
        drawMap(new Rect());
    }

}
